package lk;

public class D230920 {
    // 最大连续1的个数 III
    // 滑动窗口
    // 时间: O(N)
    // 空间: O(1)
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int zero = 0;   //  窗口滑动的过程中, 记录窗口中 0 的个数
        int maxCount = 0; // 记录结果
        int left = 0;
        int right = 0;
        while (right < n) {
            // 进窗口
            if (nums[right] == 0) {
                zero++;
            }
            while (zero > k) {
                // 窗口中 0 的个数超出, 需要出窗口
                if (nums[left++] == 0) {
                    zero--;
                }
            }
            // 更新最大值
            maxCount = Math.max(maxCount, right - left + 1);
            right++;
        }
        return maxCount;
    }


    // 删掉一个元素以后全为 1 的最长子数组
    // 必须删除一个元素
    public int longestSubarray(int[] nums) {
        int ans = 0;    // 记录结果
        int p0 = 0, p1 = 0;
        // p0 遇到 0 就归 0
        // p1 允许有一个 0（可以删除一个元素）
        // 1 1 0 1
        // 遍历到第二个位置时，p1 = 2, p0 = 2
        // 第三个位置时，p1 = 2, p0 = 0
        // 第四个位置时，p1 = 3, p0 = 1
        for (int num : nums) {
            if (num == 0) {
                p1 = p0;
                p0 = 0;
            } else {
                ++p0;
                ++p1;
            }
            ans = Math.max(ans, p1);
        }
        if (ans == nums.length) {
            --ans;
        }
        return ans;
    }
}
